﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	for (int i = 0; i < sz; i++)
//	{
//		//printf("%d ", arr[i]);//*(arr+i)--->*(i+arr)
//		//printf("%d ", *(i + arr));
//		printf("%d ", i[arr]);
//		//[]是下标引用操作符，i、arr是操作数
//	}
//	return 0;
//}

////改进版本冒泡
//void init(int arr[], int sz)
//{
//	for (int i = 0; i < sz; i++)
//	{
//		scanf("%d", arr + i);
//	}
//}
//
//void printarr(int arr[], int sz)
//{
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%d ", *(arr + i));
//	}
//	printf("\n");
//}
//
//void bobble(int arr[], int sz)//升序
//{
//	for (int i = 0; i < sz-1; i++)//sz-1轮大循环
//	{
//		int flag = 1;
//		for (int j = 0; j < sz-1-i; j++)
//		{
//			if (arr[j] > arr[j + 1]) {
//				int temp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = temp;
//				flag = 0;//说明这一趟数据并不有序
//			}
//		}
//		if (flag) {
//			break;
//		}
//	}
//}
//
//int main()
//{
//	int arr[10] = { 0 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	init(arr,sz);
//	printarr(arr, sz);
//	bobble(arr, sz);
//	printarr(arr, sz);
//
//	return 0;
//}

////指针数组模拟二维数组
//int main()
//{
//	int arr1[] = { 1,2,3,4,5 };
//	int arr2[] = { 2,3,4,5,6 };
//	int arr3[] = { 3,4,5,6,7 };
//	int* p[] = { arr1,arr2,arr3 };//[]的优先级要⾼于*号的
//	for (int i = 0; i < 3; i++)
//	{
//		for (int j = 0; j < 5; j++)
//		{
//			printf("%d ", p[i][j]);
//		}
//		printf("\n");
//	}
//
//	return 0;
//}

//int main()
//{
//	const char *p = "hello world!";//"hello world!"是常量字符串
//	const char *p2 = "hello world!";//等同于const char* p2
//	if (p == p2) {
//		printf("pp2他们指向空间一样\n");
//	}
//
//	char p3[] = "hello world!";
//	char p4[] = "hello world!";
//
//	if (p3 == p4) {
//		printf("p3p4他们指向空间一样\n");
//	}
//	char* p11 = "hello world!";//"hello world!"是常量字符串
//	char* p22 = "hello world!";//等同于const char* p2
//	if (p11 == p22) {
//		printf("p11p22他们指向空间一样\n");
//	}
//
//	printf("%s\n", p);
//	
//	while (*p11 != 0) {
//		printf("%c", *p11);
//		p11++;
//	}
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 0 };
//	int* p = arr;//int*
//	int* p1 = &arr[0];//int*
//	int(*p2)[10] = &arr;//int(*)[10]
//	return 0;
//}

//数组指针理解二维数组传参
//void print1(int arr[3][5], int r, int c)
//{
//	for (int i = 0; i < r; i++)
//	{
//		for (int j = 0; j < c; j++)
//		{
//			printf("%d ", arr[i][j]);
//		}
//		printf("\n");
//	}
//
//}

void print1(int (*arr)[5], int r, int c)//用数组指针接收
{
	for (int i = 0; i < r; i++)
	{
		for (int j = 0; j < c; j++)
		{
			printf("%d ", arr[i][j]);// arr+i就是二维数组第几个元素（也就是数组），记住现在是元素的地址，所以要解引用* 才能找到这个数组，
			//你现在要打印该数组的元素就是再偏移几个单位找到该元素的地址，再解引用就OK了
			//printf("%d ", *(*(arr + i) + j));
		}
		printf("\n");
	}

}
int main()
{
	int arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };//二维数组存的是一维数组，二维数组的元素是一维数组
	print1(arr, 3, 5);//数组名传参的时候是把第一个元素的地址传过去，相当于把一个一维数组的地址传过去
	int arr2[] = { 1,2,3,4,5,6,7,8,9 };
	int(*p)[9] = &arr2;
	for (int i = 0; i < 9; i++)
	{
		printf("%d ", (*p)[i]);//*p 把数据类型降级了 从int(*)[]变成int*
	}
	return 0;
}